/**
 * 表单验证工具类
 * 提供常用的验证方法
 */

/**
 * 验证手机号
 * @param {String} phone - 手机号
 * @returns {Boolean} - 是否有效
 */
const isValidPhone = (phone) => {
  const reg = /^1[3-9]\d{9}$/
  return reg.test(phone)
}

/**
 * 验证邮箱
 * @param {String} email - 邮箱
 * @returns {Boolean} - 是否有效
 */
const isValidEmail = (email) => {
  const reg = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/
  return reg.test(email)
}

/**
 * 验证身份证号
 * @param {String} idCard - 身份证号
 * @returns {Boolean} - 是否有效
 */
const isValidIdCard = (idCard) => {
  const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
  return reg.test(idCard)
}

/**
 * 验证URL
 * @param {String} url - URL地址
 * @returns {Boolean} - 是否有效
 */
const isValidUrl = (url) => {
  const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  return reg.test(url)
}

/**
 * 验证是否为空
 * @param {*} value - 待验证的值
 * @returns {Boolean} - 是否为空
 */
const isEmpty = (value) => {
  if (value === null || value === undefined) return true
  if (typeof value === 'string' && value.trim() === '') return true
  if (Array.isArray(value) && value.length === 0) return true
  if (typeof value === 'object' && Object.keys(value).length === 0) return true
  return false
}

/**
 * 验证是否为数字
 * @param {*} value - 待验证的值
 * @returns {Boolean} - 是否为数字
 */
const isNumber = (value) => {
  return !isNaN(parseFloat(value)) && isFinite(value)
}

/**
 * 验证是否为整数
 * @param {*} value - 待验证的值
 * @returns {Boolean} - 是否为整数
 */
const isInteger = (value) => {
  return Number.isInteger(Number(value))
}

/**
 * 验证是否在指定范围内
 * @param {Number} value - 待验证的值
 * @param {Number} min - 最小值
 * @param {Number} max - 最大值
 * @returns {Boolean} - 是否在范围内
 */
const isInRange = (value, min, max) => {
  if (!isNumber(value)) return false
  const num = Number(value)
  return num >= min && num <= max
}

/**
 * 验证字符串长度是否在指定范围内
 * @param {String} str - 待验证的字符串
 * @param {Number} min - 最小长度
 * @param {Number} max - 最大长度
 * @returns {Boolean} - 是否在范围内
 */
const isLengthInRange = (str, min, max) => {
  if (typeof str !== 'string') return false
  return str.length >= min && str.length <= max
}

/**
 * 验证是否为中文
 * @param {String} str - 待验证的字符串
 * @returns {Boolean} - 是否全为中文
 */
const isChinese = (str) => {
  const reg = /^[\u4e00-\u9fa5]+$/
  return reg.test(str)
}

/**
 * 验证是否包含中文
 * @param {String} str - 待验证的字符串
 * @returns {Boolean} - 是否包含中文
 */
const hasChinese = (str) => {
  const reg = /[\u4e00-\u9fa5]/
  return reg.test(str)
}

/**
 * 验证是否为日期格式
 * @param {String} date - 日期字符串
 * @returns {Boolean} - 是否为有效日期
 */
const isValidDate = (date) => {
  return !isNaN(new Date(date).getTime())
}

/**
 * 验证密码强度
 * @param {String} password - 密码
 * @returns {Number} - 强度等级(0-4)
 */
const checkPasswordStrength = (password) => {
  let strength = 0
  if (password.length < 6) return strength
  
  // 包含小写字母
  if (/[a-z]/.test(password)) strength++
  // 包含大写字母
  if (/[A-Z]/.test(password)) strength++
  // 包含数字
  if (/[0-9]/.test(password)) strength++
  // 包含特殊字符
  if (/[^a-zA-Z0-9]/.test(password)) strength++
  
  return strength
}

export default {
  isValidPhone,
  isValidEmail,
  isValidIdCard,
  isValidUrl,
  isEmpty,
  isNumber,
  isInteger,
  isInRange,
  isLengthInRange,
  isChinese,
  hasChinese,
  isValidDate,
  checkPasswordStrength
}